#ifndef __CLIENT_CONNECTS_HANDLER_H__
#define __CLIENT_CONNECTS_HANDLER_H__

// #include <sys/types.h>
// #include <sys/socket.h>
#include <netinet/in.h>  // sockaddr_in要用到
#include "ClientRequestAnalyzer.h"
#include "ClientSocketHandler.h"
#include "Defines.h"
#include "FileHandler.h"
#include "Tools.h"
#include "UrlConverter.h"

// 该类用于处理多客户端（不同浏览器）连接请求，使用多线程技术实现
class ClientConnectsHandler {
   private:
    // 线程处理相关数据
    struct ThreadData {
       public:
        int clientSocket;        // 客户端套接字
        sockaddr_in clientAddr;  // 客户端网络相关数据，比如ip地址之类的
        /**
         * @brief       初始化线程处理相关数据 ThreadData
         *
         * @param       socket  客户端套接字
         * @param       addr    客户端 ip 地址
         */
        ThreadData(int socket, sockaddr_in addr);
    };

   public:
    /**
     * @brief       新增客户端连接
     *
     * @param       clientSocket    客户端套接字
     * @param       clientAddr      客户端网络相关数据，比如ip地址之类的
     * @return      true            成功
     * @return      false           失败
     * @note        外部只负责传 clientSocket 和 clientAddr 这两个参数，其它数据都由当前对象内部维护（比如ThreadData）
     */
    bool _addClientConnect(int clientSocket, sockaddr_in clientAddr);

    /**
     * @brief       线程处理函数
     *
     * @param       data            线程处理相关数据，规定必须是一个void*类型，当需要传入多于一个参数时应当使用结构体传入
     * @return      void*           这是线程处理函数规定的返回值类型
     * @note        必须是静态方法，返回类型和参数类型都是万能指针void *
     * @see         该方法在 _addClientConnect 方法中成功创建线程时被调用
     */
    static void* _handleThread(void* data);
};
#endif  // !__CLIENT_CONNECTS_HANDLER_H__